package proxy.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author keithwang
 * @description
 * @date 2021/11/24 下午7:47
 */
public class Agent implements MethodInterceptor {

    // 代理类需要知道被代理人的信息,在调用时将请求转到被代理人处.
    // cglib使用继承被代理类的方式生成代理类,子类在创建的时候间接创建了父类
    // 生成代理类的方式同jdk动态代理,生成字节码文件加载到JVM中
    // invokeSuper调用的是父类的方法,如果invoke相当于是在调用子类的方法,会造成死循环.
    // 调用链路: Tony$$EnhancerByCGLIB$$6b351cd5(子类).findHouse -- intercept -- prefix -- 被代理方法 -- suffix
    public Object getInstance(Class clazz) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }

    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("录入清单信息");
        System.out.println("-----------------");
        proxy.invokeSuper(obj, args);
        System.out.println("-----------------");
        System.out.println("筛选房源信息,找到话通知租客");

        return null;
    }
}
